/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.entity.utils;

import java.lang.reflect.ParameterizedType;
import java.util.UUID;

/**
 * Cette méthode permet de comparer des éléments qui n'ont pas été persisté.
 * Il génère un tempId qui prend le rôle d'id dans le cas où 2 objets d'id null
 * sont comparés par un equals.
 * @author OPIF
 */
public abstract class ComparableEvenThoughUnpersisted <T extends ComparableEvenThoughUnpersisted> 
                                            implements IdentifiableEntity, Archivable {
    
    /**
     * Ce champ n'est pas persisté et permet de distinguer des séances théoriques
     * qui n'ont pas encore été persistées (donc qui ont l'ID null)
     * --> voir méthode equals
     */
    protected transient UUID tempId=UUID.randomUUID();

    private Class parameterizedType;


    @Override
    public boolean equals(Object object) {
        // Initialisation du type enfant pour savoir quelle est la classe T
        if(parameterizedType==null){
            ParameterizedType paramType = (ParameterizedType) this.getClass().getGenericSuperclass();
            parameterizedType = (Class) paramType.getActualTypeArguments()[0];
        }
        // Si les classes ne sont pas identitiques, les objets sont différents
        if (null == object || !(parameterizedType.equals(object.getClass()))) {
            return false;
        }
        // Si les id sont différents, les objets sont différents
        T other = (T) object;
        if ((this.getId() == null && other.getId() != null) || (this.getId() != null && !this.getId().equals(other.getId()))) {
            return false;
        }
        // Si les 2 id sont null, comparer les tempId
        return tempId.equals(other.tempId);
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (getId() != null ? getId().hashCode() : 0);
        return hash;
    }

    @Override
    public abstract Long getId();

    @Override
    public abstract boolean isArchive();

    @Override
    public abstract void setArchive(boolean archive);
    
    

}
